#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <stdbool.h>  // c扩展定义bool布尔类型

#include <stdlib.h>

// bool isAdd = false; // 是否可以累加（信号）

// 任务1 ： 负责每一个整数的阶乘计算
void *task1(void *arg){ 
    int *n = (int *)arg;
    long *ret = (long *)malloc(sizeof(long)); // 在堆中申请存放阶乘的结果
    *ret = 1;
    while(*n){
        *ret *= *n;
        (*n) --;
    }
    // 释放n的空间
    free(n);
    sleep(1);
    return ret;
} 

// 任务2:   负责累加 每一个整数的阶乘
void *task2(void *arg){
    long **ns = (long **)arg;
    long *ret = (long *)malloc(sizeof(long));

    for(int i=0;i<10;i++){
        *ret += *ns[i];
    }
    return ret;
 }

int main(int argc, char const *argv[])
{
    // 循环： 10以内整数，每一个整数传入到线程任务中（10个线程）
    pthread_t tids[10];
    for(int i=10;i>=1; i--){
        // pthread_t tid1;
        int *n = (int *)malloc(4);
        *n = i;
        pthread_create(&tids[10-i], NULL, task1, n);
    }

    // 等待10个线程完成任务
    long *rets[10]; // 存放10个线程完成的结果
    for(int i=0;i<10;i++){
        pthread_join(tids[i], (void **)&rets[i]);
        printf("%lu return %ld\n", tids[i], *rets[i]);        
    }

    // 累加运算
    pthread_t tid2;
    pthread_create(&tid2, NULL, task2, rets);

    long *total=NULL;
    pthread_join(tid2, (void **)&total);
    printf("10以内所有整数的阶乘和：%ld\n", *total);

    // 释放结果空间
    for(int i=0;i<10;i++)
        free(rets[i]); 

    free(total);
    return 0;
}
